package com.gzc.just.play.last.war.common.serializer;

import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import com.google.protobuf.MessageLite;
import com.google.protobuf.Parser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * Protobuf消息序列化器
 * 实现基于Protobuf的消息序列化和反序列化
 */
public class ProtobufMessageSerializer implements MessageSerializer {
    private static final Logger logger = LoggerFactory.getLogger(ProtobufMessageSerializer.class);
    
    // 消息ID与Protobuf解析器的映射表
    private final Map<Integer, Parser<? extends MessageLite>> parserMap = new HashMap<>();
    
    /**
     * 构造函数
     * 初始化常用消息类型的解析器
     */
    public ProtobufMessageSerializer() {
        // 注册常用消息类型的解析器
        registerParsers();
    }
    
    /**
     * 注册消息解析器
     */
    private void registerParsers() {
        try {
            // 注册GCToLS.AskLogin的解析器
            Class<?> askLoginClass = Class.forName("com.gzc.just.play.last.war.protobuf.gc.GCToLS$AskLogin");
            parserMap.put(40961, (Parser<? extends MessageLite>) askLoginClass.getMethod("parser").invoke(null));
            
            // 这里可以注册更多消息类型的解析器
            
        } catch (Exception e) {
            logger.error("Failed to register protobuf parsers", e);
        }
    }
    
    @Override
    public String serialize(Object message) {
        if (message == null) {
            return null;
        }
        
        if (message instanceof MessageLite) {
            return ((MessageLite) message).toString();
        }
        
        // 对于非Protobuf对象，使用默认的toString方法
        return message.toString();
    }
    
    @Override
    public Object deserialize(String json, int messageId) {
        // Protobuf通常不直接从JSON反序列化，而是从二进制格式
        // 这里提供一个基本实现，但不推荐使用
        logger.warn("Deserializing Protobuf message from JSON is not recommended. messageId: {}", messageId);
        return null;
    }
    
    @Override
    public byte[] serializeToBytes(Object message) {
        if (message == null) {
            return null;
        }
        
        if (message instanceof MessageLite) {
            return ((MessageLite) message).toByteArray();
        }
        
        // 对于非Protobuf对象，返回null或使用其他序列化方式
        logger.error("Object is not a Protobuf message: {}", message.getClass().getName());
        return null;
    }
    
    @Override
    public Object deserializeFromBytes(byte[] bytes, int messageId) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        
        Parser<? extends MessageLite> parser = parserMap.get(messageId);
        if (parser == null) {
            logger.error("No parser registered for messageId: {}", messageId);
            return null;
        }
        
        try {
            return parser.parseFrom(bytes);
        } catch (InvalidProtocolBufferException e) {
            logger.error("Failed to parse protobuf message for messageId: {}", messageId, e);
            return null;
        }
    }
}